package vue.actions;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

import DB.Personne;

import modele.Batiment;
import vue.FenetrePrincipale;
import vue.composants.Boutton;
import vue.composants.CarreRouge;
import vue.composants.CarreVert;

public class dialogSortie extends JDialog implements ActionListener{
	private FenetrePrincipale mere;
	private ArrayList<Personne> personnesSelected;
	@SuppressWarnings("rawtypes")
	private JComboBox comboBox;
	private JLabel labBatiment;
	private JPanel panLumiere;
	private JPanel panDroite;
	private JPanel panGauche;
	private JPanel panBoutton;
	private Boutton bouttonBadger;
	private Boutton bouttonEntrer;
	private JTable tablePersonnes;
	private CarreVert carreVert;
	private CarreRouge carreRouge;
	private boolean peutRentrer=true;
	
	private static final long serialVersionUID = 1L;

	public dialogSortie(FenetrePrincipale fp)
	{
		super(fp);
		this.setMere(fp);
		this.setBounds(500, 500, 500, 500);
		
		this.carreVert = new CarreVert();
		this.carreVert.setBackground(Color.WHITE);
		this.carreVert.setVisible(false);
		
		this.carreRouge = new CarreRouge();
		this.carreRouge.setBackground(Color.WHITE);
		this.carreRouge.setVisible(false);
		
		this.bouttonBadger = new Boutton("Badger");
		this.bouttonBadger.addActionListener(this);
		this.bouttonEntrer = new Boutton("Sortir");
		this.bouttonEntrer.addActionListener(this);
		
		this.panDroite = new JPanel();
		this.panDroite.setLayout(new GridLayout(5,1));
		this.panDroite.setSize(200,400);
		
		this.panLumiere = new JPanel();
		this.panBoutton = new JPanel();
		this.panLumiere.setSize(200,200);
		this.labBatiment = new JLabel("Batiment : ");
		this.panDroite.add(this.labBatiment);
		this.creeComboBox();
		this.panBoutton.add(this.bouttonBadger);
		this.panBoutton.add(this.bouttonEntrer);
		this.panDroite.add(this.panBoutton);
		this.panDroite.add(this.panLumiere);		
			
		this.creeTablePersonneComplete();
		
		this.getContentPane().setLayout(new GridLayout());
		this.getContentPane().add(this.panGauche);
		this.getContentPane().add(this.panDroite);
		this.getContentPane().add(this.carreRouge);
		this.getContentPane().add(this.carreVert);
		
		this.bouttonEntrer.setVisible(false);
		this.setVisible(true);
	}
	
	@SuppressWarnings({ "unchecked", "rawtypes" })
	private void creeComboBox()
	{
		this.comboBox = new JComboBox(this.mere.getControleur().getBatiments().toArray());
		this.panDroite.add(comboBox);
	}

	private void creeTablePersonneComplete()
	{
		this.panGauche = new JPanel();
		this.panGauche.setSize(200,400);
		this.panGauche.setLayout(new BorderLayout());
		
		Object[][] valeurTable = new Object[this.mere.getControleur().getPersonnes().size()][1];
		Object[] col = {"Personne"};
		
		int i =0;
		for(Personne p : this.mere.getControleur().getPersonnes())
		{
			valeurTable[i++][0]=p.getNom()+" "+p.getPrenom();
		}
		
		this.tablePersonnes = new JTable(valeurTable,col);
		JScrollPane sc = new JScrollPane(this.tablePersonnes);
		this.panGauche.add(sc);
		
	}
	
	private void creeTablePersonneRentre()
	{
		this.getContentPane().remove(this.panGauche);
		this.panGauche = new JPanel();
		this.panGauche.setSize(200,400);
		this.panGauche.setLayout(new BorderLayout());
		
		Object[][] valeurTable = new Object[this.personnesSelected.size()][1];
		Object[] col = {"Personne"};
		
		int i =0;
		for(Personne p : this.personnesSelected)
		{
			valeurTable[i++][0]=p.getNom()+" "+p.getPrenom();
		}
		
		this.tablePersonnes = new JTable(valeurTable,col);
		JScrollPane sc = new JScrollPane(this.tablePersonnes);
		this.panGauche.add(sc);
		this.getContentPane().add(this.panGauche);
		
		this.panDroite.add(new JLabel(((Batiment)this.comboBox.getSelectedItem()).getNom()));
		this.panDroite.remove(this.comboBox);
		this.revalidate();
	}
	
	private void badger()
	{
		int[] indices = this.tablePersonnes.getSelectedRows();
		this.personnesSelected = new ArrayList<Personne>();
		Batiment batiment = (Batiment) comboBox.getSelectedItem();
		
		for(int i = 0; i<indices.length;++i)
		{
			personnesSelected.add((Personne) this.mere.getControleur().getPersonnes().get((this.tablePersonnes.getSelectedRows()[i])));
		}
		
		for(Personne personne : personnesSelected)
		{
			System.out.println("La personne : \n"+personne+"\nveut entrer dans le batiment : "+batiment+".");
			if(this.mere.getControleur().aDroit(personne, batiment))
			{
				System.out.println("Sortie autorisée");
				
				this.bouttonBadger.setVisible(false);
				this.bouttonEntrer.setVisible(true);			
				
				this.getContentPane().revalidate();
				
				this.creeTablePersonneRentre();
				
				Timer t = new Timer(5000,this); //Enleve le boutton au bout de 5 secondes. 
				new Thread(t).start();	//Appele la fonction run de t, sous forme d'un thread.
				
				break;
			}
			else
			{
				System.out.println("Sortie refusée");	
			}
		}
	}
	
	private void sortie()
	{
		int[] indices = this.tablePersonnes.getSelectedRows();
		if(peutRentrer)
		{
			if(indices.length>1)
			{
				System.out.println("FRAUDE !");
			}
			else
			{
				System.out.println("Rentre");
				this.getMere().getControleur().sort(this.personnesSelected.get(this.tablePersonnes.getSelectedRow()), (Batiment) comboBox.getSelectedItem());
				this.tablePersonnes.remove(this.tablePersonnes.getSelectedRow());
				this.creeTablePersonneRentre();
			}
		}
		else
		{
			System.out.println("Quelqu'un est déjà sortie");
		}
		this.peutRentrer=false;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==this.bouttonBadger)
		{
			this.badger();
		}
		else if(e.getSource()==this.bouttonEntrer)
		{
			this.sortie();
		}
	}

	/**
	 * @return the mere
	 */
	public FenetrePrincipale getMere() {
		return mere;
	}

	/**
	 * @param mere the mere to set
	 */
	public void setMere(FenetrePrincipale mere) {
		this.mere = mere;
	}
	
	public void timerEvent()
	{
		System.out.println("Fin de mon timer");
		this.bouttonEntrer.setVisible(false);
		this.bouttonBadger.setVisible(true);
		this.peutRentrer=true;
		//this.dispose(); // pour fermer la fenetre
	}
}
